﻿using Pe.Petecos.Comercial.Aplicacion.Core.Base;
using Pe.Petecos.Comercial.Aplicacion.Core.ServiceContract;
using Pe.Petecos.Comercial.Aplicacion.Service.Base;
using Pe.Petecos.Comercial.Aplicacion.TransferObject.General;
using Pe.Petecos.Comercial.Cross.Core.Constantes;
using Pe.Petecos.Comercial.Cross.Core.Exception;
using Pe.Petecos.Comercial.Infraestructura.Core.Contract.General;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Pe.Petecos.Comercial.Aplicacion.Service.Implements
{
    public class GeneralService : GenericService, IGeneralService
    {
        public IParametroDetalleRepository parametroDetalleRepository { get; set; }
        public IClienteRepository clienteRepository { get; set; }
        public IArticuloRepository articuloRepository { get; set; }

        public IProveedorRepository proveedorRepository { get; set; }

        public ProcessResult<List<DataOpcion>> BuscarOpcion(int codigoParametro)
        {
            ProcessResult<List<DataOpcion>> resultado = new ProcessResult<List<DataOpcion>>();
            try
            {
                var listado = parametroDetalleRepository.Buscar(codigoParametro);
                resultado.Result = listado.Select(x => new DataOpcion
                {
                    Valor = x.Valor,
                    Nombre = x.Nombre
                }).ToList();
            }
            catch (Exception e)
            {
                resultado.IsSuccess = false;
                resultado.Exception = new ApplicationLayerException<GeneralService>(e);
            }

            return resultado;
        }

        public ProcessResult<List<DataCliente>> BuscarCliente(FiltroCliente filtro)
        {
            ProcessResult<List<DataCliente>> resultado = new ProcessResult<List<DataCliente>>();
            try
            {
                var listado = clienteRepository.Buscar(codigoCliente: filtro.CodigoCliente, codigoEstado: DatosConstantes.EstadoGenerico.Activo, nombreCliente: filtro.NombreCliente, numeroDocumento: filtro.NumeroDocumento);
                resultado.Result = listado.Select(x => new DataCliente
                {
                    CodigoCliente = x.CodigoCliente,
                    NombreCliente = x.NombreCliente,                    
                    NumeroDocumento = x.NumeroDocumento,                    
                    Telefono = x.Telefono,
                    CorreoElectronico = x.CorreoElectronico,

                    DocumentoContacto = x.DocumentoContacto,
                    NombreContacto = x.NombreContacto,
                    TelefonoContacto = x.TelefonoContacto,
                    CorreoElectronicoContacto = x.CorreoElectronicoContacto,

                    CodigoEstado = x.CodigoEstado,
                    NombreEstado = x.NombreEstado
                }).ToList();
            }
            catch (Exception e)
            {
                resultado.IsSuccess = false;
                resultado.Exception = new ApplicationLayerException<GeneralService>(e);
            }

            return resultado;
        }

        public ProcessResult<List<DataArticulo>> BuscarArticulo(FiltroArticulo filtro)
        {
            ProcessResult<List<DataArticulo>> resultado = new ProcessResult<List<DataArticulo>>();
            try
            {
                var listado = articuloRepository.Buscar(codigoArticulo: filtro.CodigoArticulo, codigoCategoriaArticulo: filtro.CodigoCategoriaArticulo, codigoEstado: filtro.CodigoEstado, nombreArticulo: filtro.NombreArticulo);

                resultado.Result = listado.Select(x => new DataArticulo
                {
                    CodigoArticulo = x.CodigoArticulo,
                    CodigoCategoriaArticulo = x.CodigoCategoriaArticulo,
                    CodigoEstado = x.CodigoEstado,
                    NombreArticulo = x.NombreArticulo,
                    NombreCategoriaArticulo = x.NombreCategoriaArticulo,
                    PrecioUnitario = x.PrecioUnitario,
                    NombreEstado = x.NombreEstado
                }).ToList();
            }
            catch (Exception e)
            {
                resultado.IsSuccess = false;
                resultado.Exception = new ApplicationLayerException<GeneralService>(e);
            }

            return resultado;
        }

        public ProcessResult<List<DataArticuloProveedor>> BuscarArticuloProveedor(FiltroArticulo filtro)
        {
            ProcessResult<List<DataArticuloProveedor>> resultado = new ProcessResult<List<DataArticuloProveedor>>();
            try
            {
                var listado = articuloRepository.BuscarArticuloProveedor(codigoArticulo: filtro.CodigoArticulo, codigoCategoriaArticulo: filtro.CodigoCategoriaArticulo, codigoEstado: filtro.CodigoEstado, nombreArticulo: filtro.NombreArticulo);

                resultado.Result = listado.Select(x => new DataArticuloProveedor
                {
                    CodigoArticuloProveedor = x.CodigoArticuloProveedor,
                    CodigoProveedor = x.CodigoProveedor,
                    NombreProveedor = x.NombreProveedor,
                    CodigoArticulo = x.CodigoArticulo,
                    CodigoCategoriaArticulo = x.CodigoCategoriaArticulo,
                    CodigoEstado = x.CodigoEstado,
                    NombreArticulo = x.NombreArticulo,
                    NombreCategoriaArticulo = x.NombreCategoriaArticulo,
                    PrecioUnitario = x.PrecioUnitario,
                    NombreEstado = x.NombreEstado
                }).ToList();
            }
            catch (Exception e)
            {
                resultado.IsSuccess = false;
                resultado.Exception = new ApplicationLayerException<GeneralService>(e);
            }

            return resultado;
        }

        public ProcessResult<List<DataProveedor>> BuscarProveedorProyecto(int codigoEvento)
        {
            ProcessResult<List<DataProveedor>> resultado = new ProcessResult<List<DataProveedor>>();
            try
            {
                var listado = proveedorRepository.BuscarProveedorProyecto(codigoEvento);

                resultado.Result = listado.Select(x => new DataProveedor
                {
                    CodigoProveedor = x.CodigoProveedor,
                    Nombre = x.Nombre,
                    NumeroDocumento = x.NumeroDocumento,
                    Direccion = x.Direccion,
                    Distrito = x.Distrito,
                    Telefono1 = x.Telefono1,
                    Telefono2 = x.Telefono2,
                    Telefono3 = x.Telefono3,
                    CorreoElectronico = x.CorreoElectronico,
                    NombreContacto = x.NombreContacto
                }).ToList();
            }
            catch (Exception e)
            {
                resultado.IsSuccess = false;
                resultado.Exception = new ApplicationLayerException<GeneralService>(e);
            }

            return resultado;
        }

        public void Dispose()
        {
        }

    }
}
